

#include <atomic_adapter.hpp>

struct cache_value
{
	char *m_block_data;
	size_t m_block_size;

	xbase::atomic_adapter<uint32_t> m_ref_count;

	cache_value()
		: m_block_data(0)
		, m_block_size(0)
		, m_ref_count(0) {}

	uint32_t ref_count() const {
		return m_ref_count.value();
	}

	bool is_no_ref() const {
		return m_ref_count == 0;
	}

	void reset_ref_count(uint32_t value) {
		m_ref_count = value;
	}

	uint32_t inc_ref_count() {
		return ++m_ref_count;
	}

	uint32_t dec_ref_count() {
		return --m_ref_count;
	}

	std::size_t size() const {
		return m_block_size;
	}
};

int main()
{
	uint32_t ret = 0;
	cache_value cv;
	assert(cv.ref_count() == 0);
	assert(cv.is_no_ref());

	cv.reset_ref_count(1);
	assert(cv.ref_count() == 1);
	assert(! cv.is_no_ref());

	ret = cv.inc_ref_count();
	assert(cv.ref_count() == 2);
	assert(! cv.is_no_ref());
	assert(ret == 2);

	ret = cv.dec_ref_count();
	assert(cv.ref_count() == 1);
	assert(! cv.is_no_ref());
	assert(ret == 1);

	ret = cv.dec_ref_count();
	assert(cv.ref_count() == 0);
	assert(cv.is_no_ref());
	assert(ret == 0);
	
	return 0;
}
